/* * Author: Chris Seguin * * This software has been developed under the copyleft * rules of the GNU General Public License. Please * consult the GNU General Public License for more * details about use and distribution of this software. */ package org.acm.seguin.uml; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Point; import java.awt.Rectangle; import java.util.Iterator; import java.util.LinkedList; import javax.swing.JLabel; import javax.swing.JPanel; import org.acm.seguin.uml.line.DragPanelAdapter; import org.acm.seguin.uml.line.SizableLabel; /** * Holds the roles associated with a type * *@author Chris Seguin *@created September 30, 1999 */ public class RoleHolder extends JPanel { private LinkedList labels; private int wide; private int high; private UMLMouseAdapter popupMenuListener; private DragPanelAdapter panelDragAdapter; /** * Constructor for the RoleHolder object * *@param popupMenuListener listener that launches the popup menu *@param panelDragAdapter listener that drags the type */ public RoleHolder(UMLMouseAdapter popupMenuListener, DragPanelAdapter panelDragAdapter) { setLayout(null); labels = new LinkedList(); wide = 0; high = 0; this.popupMenuListener = popupMenuListener; this.panelDragAdapter = panelDragAdapter; } /** * Gets the preferred size * *@return the preferred size for this object */ public Dimension getPreferredSize() { return new Dimension(wide, high); } /** * Gets the minimum size * *@return The minimum size for this object */ public Dimension getMinimumSize() { return getPreferredSize(); } /** * Adds a role * *@param msg the role name */ public void add(String msg) { SizableLabel roleLabel = new SizableLabel(msg); roleLabel.setSLFont(UMLLine.defaultFont); roleLabel.setSLHorizontalAlignment(JLabel.CENTER); roleLabel.setLocation(0, high); add(roleLabel); Dimension dim = roleLabel.getPreferredSize(); roleLabel.setSize(dim); wide = Math.max(wide, dim.width); high = high + dim.height; roleLabel.addMouseListener(popupMenuListener); roleLabel.addMouseListener(panelDragAdapter); roleLabel.addMouseMotionListener(panelDragAdapter); labels.add(roleLabel); } /** * Determines if there are any roles * *@return Description of the Returned Value */ public boolean hasAny() { return (high > 0); } /** * Reset width * *@param newWidth the new width */ public void resetWidth(int newWidth) { Dimension temp = getPreferredSize(); temp.width = newWidth; setSize(temp); Iterator iter = labels.iterator(); while (iter.hasNext()) { SizableLabel next = (SizableLabel) iter.next(); temp = next.getPreferredSize(); temp.width = newWidth; next.setSize(temp); } } /** * Print the roles * *@param g Description of Parameter *@param x Description of Parameter *@param y Description of Parameter */ public void print(Graphics g, int x, int y) { Rectangle bounds = getBounds(); g.setFont(UMLLine.defaultFont); FontMetrics fm = g.getFontMetrics(); Iterator iter = labels.iterator(); while (iter.hasNext()) { SizableLabel roleLabel = (SizableLabel) iter.next(); Point pt = roleLabel.getLocation(); roleLabel.print(g, x + pt.x, y + pt.y); } } /** * Sets the scaling factor * *@param value scaling factor */ public void scale(double value) { Iterator iter = labels.iterator(); while (iter.hasNext()) { SizableLabel roleLabel = (SizableLabel) iter.next(); roleLabel.scale(value); } } }